
namespace ShoppingCart.Business.Logic
{
	using System;
	using System.Collections.Generic;
    using System.Linq;
	using ShoppingCart.Business.Entity;
	using ShoppingCart.DataAccess;
    using ShoppingCart.Business.Entity.Enums;

	/// <summary>
	/// Represents the Manager of Pedido.
	/// </summary>
	[Serializable]
	public class PedidoManager : Singleton<PedidoManager>
	{
		#region Methods

		/// <summary>
		/// Selects a single record from the Pedido table.
		/// </summary>
		public Pedido Obtener(int idPedido)
		{
			try
			{
				return PedidoData.Instancia.Obtener(idPedido);
			}
			catch (Exception) { throw; }
		}

		/// <summary>
		/// Selects all records from the Pedido table by a foreign key.
		/// </summary>
		public IList<Pedido> ListarPorIdCliente(int idCliente, byte? estado)
		{
            try
            {
                var pedidos = PedidoData.Instancia.ListarPorIdCliente(idCliente);
                if (estado.HasValue) pedidos = pedidos.Where(p => p.Estado == estado).ToList();
                return pedidos;
            }
            catch (Exception) { throw; }
		}

		/// <summary>
		/// Selects all records from the Pedido table by a foreign key.
		/// </summary>
		public IList<Pedido> ListarPorIdDepartamento(int idDepartamento)
		{
			try
			{
				return PedidoData.Instancia.ListarPorIdDepartamento(idDepartamento);
			}
			catch (Exception) { throw; }
		}

        public IDictionary<byte, string> ListarEstados()
        {
            var estados = new Dictionary<byte, string>();
            foreach (var estado in Enum.GetValues(typeof(Estado)))
            {
                estados.Add((byte)estado, Enum.GetName(typeof(Estado), estado));
            }
            return estados;
        }

		/// <summary>
		/// Saves a record to the Pedido table.
		/// </summary>
		public int Agregar(Pedido pedido)
		{
			try
			{
				return PedidoData.Instancia.Agregar(pedido);
			}
			catch (Exception) { throw; }
		}

		/// <summary>
		/// Updates a record in the Pedido table.
		/// </summary>
		public bool Modificar(Pedido pedido)
		{
			try
			{
				return PedidoData.Instancia.Modificar(pedido);
			}
			catch (Exception) { throw; }
        }

        public void ModificarEstado(int idPedido, byte estado, string autorizador)
        {
            try
            {
                PedidoData.Instancia.ModificarEstado(idPedido, estado, autorizador);
            }
            catch (Exception) { throw; }
        }

        /// <summary>
		/// Deletes a record from the Pedido table by its primary key.
		/// </summary>
		public bool Eliminar(int idPedido)
		{
			try
			{
				return PedidoData.Instancia.Eliminar(idPedido);
			}
			catch (Exception) { throw; }
		}

		/// <summary>
		/// Deletes a record from the Pedido table by a foreign key.
		/// </summary>
		public void EliminarPorIdCliente(int idCliente)
		{
			try
			{
				PedidoData.Instancia.EliminarPorIdCliente(idCliente);
			}
			catch (Exception) { throw; }
		}

		/// <summary>
		/// Deletes a record from the Pedido table by a foreign key.
		/// </summary>
		public void EliminarPorIdDepartamento(int idDepartamento)
		{
			try
			{
				PedidoData.Instancia.EliminarPorIdDepartamento(idDepartamento);
			}
			catch (Exception) { throw; }
		}

		#endregion
	}
}
